//
//  AVPlaySDK.h
//  AVPlaySDK
//
//  Created by hu_danyuan on 2018-11-20.
//   (c) Copyright 2018,  hu_danyuan All Rights Reserved
//
//	描    述:  实时流方式播放、文件流方式播放、文件方式播放。SDK接口
//

#import <Foundation/Foundation.h>


/****************************************************************************
***常量定义
****************************************************************************/

// SDK内部数据类型定义
typedef int								AVPLAY_int32;
typedef float							AVPLAY_float32;
typedef int								AVPLAY_BOOL;
typedef void*							AVPLAY_HANDLE;
typedef unsigned char					AVPLAY_BYTE;

#define AVPLAY_AUDIO_PCM    7

// 错误码，对应AVPLAY_GetLastError接口的返回值
#define AVPLAY_EC(x)					(0x80000000 | x)
#define AVPLAY_OK						0					// 没有错误
#define AVPLAY_ERROR_UNKNOWN            AVPLAY_EC(0x01)		// 未知错误
#define AVPLAY_LOW_MEMORY               AVPLAY_EC(0x02)		// 内存不足
#define AVPLAY_INVALID_HANDLE			AVPLAY_EC(0x03)		// 句柄无效
#define AVPLAY_INVALID_PARAM			AVPLAY_EC(0x04)		// 参数不合法
#define AVPLAY_RESOLUTION_UNSUPPORT		AVPLAY_EC(0x05)		// 不支持此分辨率
#define AVPLAY_FRAME_UNSUPPORT          AVPLAY_EC(0x06)		// 不支持帧类型
#define AVPLAY_ERROR_FILE				AVPLAY_EC(0x07)		// 文件错误

// 帧类型
#define AVPLAY_FRAME_VIDEO              1
#define AVPLAY_FRAME_AUDIO              2

@interface AVPLAY_FrameInfo : NSObject

@property (nonatomic, assign) unsigned int    nFrameId;       // 帧id，可用于丢帧判断 //
@property (nonatomic, assign) unsigned int    nFrameSize;     // 帧大小 //
@property (nonatomic, assign) unsigned int    nTimestamp;     // 时间戳 //
@property (nonatomic, assign) AVPLAY_int32    nFrameType;     // AVPLAY_FRAME //

@end

/****************************************************************************
***回调函数定义
****************************************************************************/

// 播放回调
@protocol IAVPLAY_PlayCallback <NSObject>

- (AVPLAY_int32) onSolutionChanged:(AVPLAY_HANDLE)hPlayHandle Width:(AVPLAY_int32)nWidth Height:(AVPLAY_int32)nHeight Param:(void*)pContext;

- (AVPLAY_int32) onPlayPosition:(AVPLAY_HANDLE)hPlayHandle StartTime:(AVPLAY_int32)nStartTime EndTime:(AVPLAY_int32)nEndTime CurTime: (AVPLAY_int32)nCurTime Param:(void*)pContext;

- (AVPLAY_int32) onLostFrame:(AVPLAY_HANDLE)hPlayHandle FrameInfo:(AVPLAY_FrameInfo *)pFrameInfo;

// bNeedInput: TRUE 表示缓冲区变小，需要继续添加数据；  FALSE表示缓冲区过大，可以暂停添加数据。
- (AVPLAY_int32) onNotifyInputData:(AVPLAY_HANDLE)hPlayHandle Flag:(BOOL)bNeedInput;

- (AVPLAY_int32) onEmpty:(AVPLAY_HANDLE)hPlayHandle;

@end


// 音频采集回调
@protocol IAVPLAY_AudioRecordCallback <NSObject>

- (AVPLAY_int32) onAudioFrameData: (AVPLAY_HANDLE)hAudioHandle Buf: (AVPLAY_BYTE *)pBuf Len: (AVPLAY_int32)nLen Param: (void*)pContext;

@end


/****************************************************************************
***结构体定义
****************************************************************************/




/****************************************************************************
***接口定义
****************************************************************************/

@interface AVPlaySDK : NSObject 
{

}

// sdk初始化
+ (AVPLAY_BOOL)			AVPLAY_Startup;

// sdk退出清理
+ (void)				AVPLAY_Cleanup;

// 获取sdk版本信息
+ (AVPLAY_int32)		AVPLAY_GetSDKVersion;

// 获取错误码
+ (AVPLAY_int32)		AVPLAY_GetLastError;


// 打开流播放，nType（0：实时流，1：文件流）
+ (AVPLAY_HANDLE)		AVPLAY_OpenStream:(AVPLAY_int32)nType DelayTime: (AVPLAY_int32)nDelayTime;

// 关闭流播放
+ (void)				AVPLAY_CloseStream: (AVPLAY_HANDLE)hPlayHandle;

// 开始播放
+ (AVPLAY_BOOL)			AVPLAY_Play: (AVPLAY_HANDLE)hPlayHandle
                             View: (void*)view
                            Scale: (AVPLAY_float32)fDisplayScale
                         Callback: (id<IAVPLAY_PlayCallback>)pPlayCallback Param: (void*)pContext;

// 停止播放
+ (AVPLAY_BOOL)			AVPLAY_Stop: (AVPLAY_HANDLE)hPlayHandle;

// 输入数据流
+ (AVPLAY_BOOL)			AVPLAY_InputData: (AVPLAY_HANDLE)hPlayHandle Buf: (AVPLAY_BYTE *)pBuf Len: (AVPLAY_int32)nLen;


// 暂停与继续
+ (AVPLAY_BOOL)			AVPLAY_Pause: (AVPLAY_HANDLE)hPlayHandle Pause: (AVPLAY_BOOL)bPause;

// 调整播放速度，nSpeed（－1：当前基础上再慢放1倍，0：正常速度，1：当前基础上再快放1倍）
+ (AVPLAY_BOOL)			AVPLAY_SetPlaySpeed: (AVPLAY_HANDLE)hPlayHandle Speed: (AVPLAY_int32)nMultiSpeed;

// 获取播放速度
+ (AVPLAY_float32)      AVPLAY_GetPlaySpeed: (AVPLAY_HANDLE)hPlayHandle;

// 单帧播放
+ (AVPLAY_BOOL)			AVPLAY_Step: (AVPLAY_HANDLE)hPlayHandle;

// 抓图
+ (AVPLAY_BOOL)			AVPLAY_SnapPicture: (AVPLAY_HANDLE)hPlayHandle File: (char *)szFileName Quality: (AVPLAY_int32)nQuality;

// 打开音频
+ (AVPLAY_BOOL)			AVPLAY_OpenAudio: (AVPLAY_HANDLE)hPlayHandle;

// 关闭音频
+ (AVPLAY_BOOL)			AVPLAY_CloseAudio: (AVPLAY_HANDLE)hPlayHandle;

// 获取音量，0～100
+ (AVPLAY_BYTE)			AVPLAY_GetAudioVolume: (AVPLAY_HANDLE)hPlayHandle;

// 设置音量
+ (AVPLAY_BOOL)			AVPLAY_SetAudioVolume: (AVPLAY_HANDLE)hPlayHandle Volume: (AVPLAY_BYTE)nVolume;


// 开始采集音频
+ (AVPLAY_HANDLE)       AVPLAY_StartAudioRecord: (AVPLAY_int32)nEncodeType
                                     SampleRate: (AVPLAY_int32)nSampleRate
                                  BitsPerSample: (AVPLAY_int32)nBitsPerSample
                                     ChannelNum: (AVPLAY_int32)nChannelNum
                                       Callback: (id<IAVPLAY_AudioRecordCallback>)pAudioCallback
                                          Param: (void*)pContext;

// 停止采集音频
+ (void)                AVPLAY_StopAudioRecord: (AVPLAY_HANDLE)hAudioHandle;


@end





